/**
 * =====================================================================================
 *
 *      @file:  cache.h
 *
 *    	@brief:  对openPlant数据进行缓存
 *
 *      @version:  1.0
 *      Created:  2010年04月12日 15时05分56秒
 *      Revision:  none
 *      Compiler:  gcc -Wall -Wextra cache.h
 *
 *      @author:  easyeagel (LiuGuangBao), easyeagel@gmx.com
 *      Company:  简单C++ - www.easycpp.org
 *
 * =====================================================================================
 */

#ifndef M_magus_sql_cache_h
#define M_magus_sql_cache_h

#ifdef __cplusplus
#include<ctime>
extern "C"
{
#else
#include<time.h>
#endif

#include"opapi.hpp"
#include"base.hpp"
#include"cache_vector.hpp"

#define MinitSize 64

typedef struct cache_t
{
	time_t last_update;
	vector_t* plant; /**< 工厂列表，@ref OPplant_cache_t */
}cache_t;

typedef struct OPplant_t
{
	time_t last_update;
	char* name;
	cache_t* parent;
}OPplant_t;

typedef struct OPplant_cache_t
{
	time_t last_update;
	OPplant_t info;
	vector_t* node; /**< 每个工厂里的节点列表，@ref OPnode_cache_t */
}OPplant_cache_t;

typedef struct OPnode_t
{
	time_t last_update;
	OPplant_cache_t* parent;
	NodeInfo info;
}OPnode_t;

typedef struct OPnode_cache_t
{
	time_t last_update;
	OPnode_t info;
	vector_t* point; /**< 一个节点里的点列表，@ref OPpoint_t */
}OPnode_cache_t;

typedef struct OPpoint_t
{
	time_t last_update;
	OPnode_cache_t* parent;
	PointInfo info;
}OPpoint_t;

/* =============================================================== */
/* 初始化 */

/** 
* @brief 初始化node的缓存结构
* 
* @param node 需要初始的node结构，内存已经分配好
* 
* @return RLT_yes：成功；RLT_no：失败
*/
int srlt_node_cache_init(OPnode_cache_t* node, size_t num);

/** 
* @brief 初始化plant的缓存结构
* 
* @param plant 需要初始的plant结构，内存已经分配好
* 
* @return RLT_yes：成功；RLT_no：失败
*/
int srlt_plant_cache_init(OPplant_cache_t* plant, size_t num);

/** 
* @brief 初始化缓存结构
* 
* @param cac 需要初始的cache结构，内存已经分配好
* 
* @return RLT_yes：成功；RLT_no：失败
*/
int srlt_cache_init(cache_t* cac);

/**
 * @brief 打印出经过缓存的内容
 * @param cac 需要打印的缓存
 */
void srlt_cache_print(cache_t* cac);

/* =============================================================== */
/* 加载缓存 */

/** 
* @brief 装载缓存，把可能缓存全体缓存下来
* 
* @param cac 缓存结构体
* @param ps 工厂列表，相当于“W3”
* 
* @return RLT_yes：成功；RLT_no：失败
*
* @note 此函数假设缓存不存在，并且openPlant已经连接
*/
int srlt_cache_load(cache_t* sc, const char** ps);

/** 
* @brief 加载一个plant下面node缓存
* 
* @param plant 需要加载的Plant
* 
* @return RLT_yes：成功；RLT_no，失败
*
* @todo 加入具体的实现
*/
int srlt_plant_cache_load(OPplant_cache_t* plant);

/** 
* @brief 加载一个node，包括其中的point
* 
* @param node 需要加载的node
* 
* @return RLT_yes：成功；RLT_no：失败
*/
int srlt_node_cache_load(OPnode_cache_t* node);

#ifdef __cplusplus
}
#endif

#endif /* M_magus_sql_cache_h */


